﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FactoryMethod;
using SampleFactory;
using Strategy;
using Singleton;
using Builder;
using Prototype;

namespace DesignPattern
{
    class Program
    {
        static void Main(string[] args)
        {
            #region  创建型
            //简单工厂模式
            ISender send = SendFactory.ProduceMail();
            send.Send();

            //工厂方法模式
            IFactory fac = new MailSenderFactory();
            Common.ISender sen=fac.CreateSender();
            sen.Send("Factory Method ");

            //单例模式
           
            SingletonClass sc = SingletonClass.GetInstance();
            SingletonClass scClone = SingletonClass.GetInstance();
            if (sc == scClone)
            {
                Console.WriteLine("sc==scClone");
            }

            Console.WriteLine("-------------Builder模式---------------");

            Director dir = new Director();
            BuilderA A=new BuilderA();
            dir.Construct(A);
            Product pd = A.GetResult();
            pd.Show();



            Console.WriteLine("-------------Prototype模式---------------");

            Resume re = new Resume("superman");
            re.SetPersonInfo("13", "男");
            re.SetWorkExpress("0-11111", "地球");
            re.Display();

            Resume reClone = (Resume)re.Clone();
            reClone.SetWorkExpress("1111-20000", "火星");
            reClone.Display();
          
            #endregion

       
        

            #region 行为型
            //策略模式
            SendContext sendContext = new SendContext("Mail");
            sendContext.Send();

            #endregion

            #region 结构型
            //适配器模式   类似于DataAdpater
            //将不同接口实现的类包装在同一个接口实现的类中，从而实现适配

            //桥接模式  设计类的时候应该首先考虑聚合 其次在考虑继承

            //装饰模式 类都继承同一个父类 为已有功能动态增加更多功能

            //代理模式 代理类跟被代理类继承同一个接口  在代理类的接口方法实现中调用被代理类的相同方法

            //外观模式  
            
            //享元模式 String 类就是用了享元模式，如果两个字符串的值相同，则它们指向的是相同的内存空间
            #endregion
            Console.Read();
        }
    }
}
